package com.freedy.algorithm.dynamic;

import java.util.Arrays;

/**
 * @author Freedy
 * @date 2021/4/12 15:10
 */
public class BackPack {
    public static void main(String[] args) {
        int[] weight = {1, 4, 3};
        int[] value = {1500, 3000, 2000};
        int capacity = 4;//背包的容量
        int n = value.length;//物品的数量
        int[][] valueTable = new int[n + 1][capacity + 1];
        int[][] path=new int[n + 1][capacity + 1];
        //根据前面得到的公式动态规划处理
        for (int i = 1; i < n + 1; i++) {//不处理第一行
            for (int j = 1; j < capacity + 1; j++) {//不处理第一列
                if (weight[i - 1] > j) {
                    valueTable[i][j] = valueTable[i - 1][j];//表示放不下去，取上一行的最优解
                } else {
                    //表示可以放下去，比较上一行的最优解与
                    //上一行减去所需重量的最优解加上新加上去的物品的价值
                    //谁大就是本格的最优解
                   if ( valueTable[i - 1][j]>(value[i - 1] + valueTable[i - 1][j - weight[i - 1]])){
                       valueTable[i][j]=valueTable[i - 1][j];
                   }else {
                       valueTable[i][j]= value[i - 1] + valueTable[i - 1][j - weight[i - 1]];
                       path[i][j]=1;
                   }

                }
            }
        }
        for (int[] ints : valueTable) {
            System.out.println(Arrays.toString(ints));
        }
        System.out.print("最优解为:装入");
        for (int i = 0; i < path.length; i++) {
            if (path[i][path[i].length-1]==1) {
                System.out.print(i + "号 ");
            }
        }
        System.out.println("物品，总计价值:"+valueTable[n][capacity]);
    }
}
